iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
0
Modern Web

關於 Ruby on Rails,我想說的是系列 第 11

[Day 11] MVC 架構

  • 分享至 

  • xImage
  •  

真是~太~可惜了~
昨天晚上很趕的送出文章後 12:00:06
11th鐵人賽宣告失敗ಥ_ಥ
當下除了悔恨還有一點難過
但就像馬拉松,不管抽筋還是腳痛,走都要走到終點
今天就要正式進入Rails 的世界


MVC 架構

MVC可以說是Rails的中心理念,分別代表:

  • Model 邏輯處理(物件操作)
  • Controller 視覺呈現
  • View 路由控制(發送、接收請求)

MVC架構是一種網頁Design Pattern(設計模式)
強調職責分離,開發與維護人員可以更快速對於目的與問題,找到該處理的程式,讓程式的修改與功能擴充簡化。
不論是寫好幾年的Rails老手,或剛接觸Rails的菜鳥,檔案架構大致相同,都是大家遵循MVC架構所賜。例如想找一個前端頁面,我會在view資料夾底下找,而不會跑去controller,大幅減少共同開發的成本


MVC 流程以現實狀況舉例,就像到了大醫院一樓,但不知道要看哪一科,我會先問ㄧ樓詢問處(Controller),志工再幫我問特定門診值班(Model),志工問到結果後,再告知查詢結果(View)

Controller (ㄧ樓詢問處)

Controller 是從 ApplicationController 繼承而來的類別。
當一個請求(request)進來,路由(router)決定是哪個 Controller 的來執行,該 Controller 會負責該請求,通常先到Model要資料,拿到後做一些簡單的處理,找到對應的View來呈現成果給使用者。
按照 REST 規範來編寫的應用程式來說,Controller 的每個public method 都有一個對應的router,讓某個request 條理分明。

Controller 可以想成是 Model 與 View 的中間人,負責替 Model 將資料傳給 View,Controller 也將使用者更新或儲存的資料,存回 Model。

Model (門診值班)

大部分的商業邏輯都放在這裡,透過ActiveRecordGem,使用特殊的ORM語法,讓我們可以很輕鬆的跟資料庫做溝通,也就是CRUD(新增/讀取/修改/刪除)這些動作。如果沒有ORM語法,要自己撰寫SQL(結構化查詢語言),會降低開發速度及增加學習負擔。

View (查詢結果回覆)

接受controller傳過來的資料,算繪(Render)給網站的使用者。
View 是 Action View 模版,是由嵌入 HTML 的 Ruby 撰寫而成(Embedded Ruby, erb)。
Action View 提供了許多輔助方法(helper),用來撰寫表單、日期及字串等。每個 Controller 在 app/views 中都會有一個對應的資料夾,裡面包含了該 Controller 的模板檔案,檔名對應到 controller 的某一個method_name 。
回傳給用戶端的 HTML 是由這個 ERB 檔案(Templates)、版型(Layouts),以及其它引用的局部頁面(Partials)組成。

(這裡的erb換成SlimHaml,甚至使用者可以自己改版型的Liquid 也可以。另外,如果是前後端分離,就不是用Rail的這幾個樣板引擎了)

三分天下圖總結:

Model : 包含所有的邏輯、物件,內容豐富。
Controller : 盡量輕量,這裡盡量不撰寫邏輯與物件,而以路由以傳遞資料為主。
View : 僅呈現,故盡量單純(笨笨)的呈現即可。

所以才有Fat model, skinny controller的說法。

MVC就這樣出現!!


為什麼要有MVC?

答案是關注點分離,把原來亂七八糟前後端邏輯混在一起的義大利麵條式程式碼,整理出頭緒。是你的就是你的,你要存取資料庫就是去Model裡面,你要寫HTML就去View,絕對不會出現在View裡面下SQL Query這種事情。
使用MVC後,原本混在一起的code去符合MVC的規範,讓職責變得更清楚。

request是怎麼實現的?

一張圖說明

1.使用者在Chorme 點擊一個按鈕,發出Ajax,例如顯示用戶user1資料
2.Rails Router 接到這個 request (ex.users/1)
3.Router 找到對應的 UserController
4.Controller 找到 User Model
5.User Model 去 Database 要到user1資料
6.User Model 將user1 傳回給UserControllers
7.UserController 傳給 View (ex. user/show.erb)
8.View 將 最後結果轉換成瀏覽器看得懂的html給client端的Chrome

上面這張圖是我覺得解釋Rail MVC最清楚的,如果還有不懂歡迎留言詢問


最後來看一下Ruby老爸-松本行弘在前幾天 Ruby conf China的專訪

[寫 Ruby 時工作特別閑,總加班的人很難做出創造]
https://www.infoq.cn/article/3VAEudwWmwDhLx1LUbmX


上一篇
[Day 10] 字串魔法師 - 正規表達式 RegExp
下一篇
#[Day 12] Ruby 算符優先序 Operator Precedence
系列文
關於 Ruby on Rails,我想說的是23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言